package com.le.tester.book.effectivejava3rdchinese.secondReading.l07;

import java.util.Arrays;
import java.util.EmptyStackException;

/**
 * createTime：2024-08-12 14:09
 * description：消除过期的对象引用。不要让这些过期对象一直存在于系统中，不然时间久了，早晚会发生内存泄露。
 */
public class SelfStack {

    public Object[] elements;

    public int size = 0;

    public static final int DEFAULT_INITIAL_CAPACITY = 16;

    public SelfStack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    //增加栈的空间
    private void ensureCapacity() {
        if (elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }

    //异常内存泄露
    public Object pop() {
        if (size == 0) {
            throw new EmptyStackException();
        }

        //不要这么干
        //如果一个栈增长后收缩，那么从栈弹出的对象不会被垃圾收集，即使使用栈的程序不再引用这些对象
        Object result = elements[size--];

        //记得处理收缩的栈元素
        elements[size] = null;
        return result;

    }
//    真的不可取
//    @Override
//    protected SelfStack clone() throws CloneNotSupportedException {
//        SelfStack result = (SelfStack) super.clone();
//        //数组的元素进行赋值，克隆内部的元素
//        result.elements = elements.clone();
//        return result;
//    }
}
